class_name GameplayEffectAsset
extends Resource

## 持续时间策略
enum DurationPolicy {
    Instant,
    Duration,
    Infinite,
}

## 持续时间刷新策略
enum DurationRefreshPolicy {
    None,
    RefreshOnSuccessfulApplication,
}

## 叠加策略
enum StackPolicy {
    None,
    AggregateBySource,
    AggregateByTarget,
}

@export_group("资源信息")

## 效果名称
@export var name: String

## 效果描述
@export_multiline var description: String

## 效果资源标签
@export var asset_tags: Array[String]

@export_group("效果")

## 所需要修改的属性名称
@export var attribute_name: String

## 用于修改属性的修改器
@export var modifiers: Array[GameplayEffectModifier]

## 效果激活时所赋予的能力，需要将效果激活策略设置为 Duration 或者 Infinite
@export var granted_abilities: Array[GameplayAbilityAsset]

## 效果激活时所赋予的标签，需要将效果激活策略设置为 Duration 或者 Infinite
@export var granted_tags: Array[String]

@export_group("逻辑策略")

## 效果持续时间策略
@export var duration_policy: DurationPolicy

## 效果持续时间，需要将效果激活策略设置为 Duration
@export_range(0, 1000, 0.1, "or_greater") var duration: float

## 效果触发的周期时间，需要将效果激活策略设置为 Duration 或者 Infinite
@export_range(0, 1000, 0.1, "or_greater") var period: float

## 效果持续时间刷新策略
@export var duration_refresh_policy: DurationRefreshPolicy

## 效果叠加策略
@export var stack_policy: StackPolicy

##
@export_range(1, 100, 1, "or_greater") var max_stack_count: int

@export_group("施加策略")

## 效果激活时所不能拥有的标签，否则效果则不能激活
@export var tags_cancelled_effect: Array[String]


#region Need to override
func create_spec(source: AbilitySystemComponent, target: AbilitySystemComponent) -> GameplayEffect:
    return GameplayEffect.new(self, source, target)
#endregion
